package javaeSE.collection;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/*
 * 1.集合、数组都是对多个数据进行存储操作的结构，简称Java容器。不涉及到持久化的存储（.txt,.jpg,.avi，数据库中）
 * 2.1 数组在存储多个数据方面的特点：
 *      > 一旦初始化以后，其长度就确定了。数组一旦定义好，其元素的类型也就确定了。我们也就只能操作指定类型的数据了。

 * 2.2 数组在存储多个数据方面的缺点：
 *      > 初始化以后长度不可修改。
 *      > 非常有限，添加、删除、插入数据等操作，不便，同时效率不高。
 *      > 数组存储数据的特点：有序、可重复。对于无序、不可重复的需求，不能满足。
 *
 * 二、集合框架
 *      |----Collection接口：单列集合，用来存储一个一个的对象       A
 *          |----List接口：存储有序的、可重复的数据。  -->“动态”数组  A B
 *              |----ArrayList、LinkedList、Vector                    A B C
 *
 *          |----Set接口：存储无序的、不可重复的数据   -->高中讲的“集合”
 *              |----HashSet、LinkedHashSet、TreeSet
 *
 *      |----Map接口：双列集合，用来存储一对(key - value)一对的数据   -->高中函数：y = f(x)
 *              |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

 * 结论：
 * 向Collection接口的实现类的对象中添加数据obj时，要求obj所在类要重写equals()方法
   add
   addAll
   size
   remove  从当前集合中移除obj元素。 迭代器里面也有一个remove  不要混淆
   removeAll 可以用作求差集
   retainAll 可以用作求交集
   clear
   contains
   isEmpty()
   containsAll 包含，有一个不在就是false
    equals：    集合的equals比较
    hashcode:
 */

public class CollectionsTest {
    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
//        Person p = new Person("Jerry",20);
//        coll.add(p);
//        System.out.println(coll.contains(p));//true
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //1.contains(Object obj):判断当前集合中是否包含obj
        //我们在判断时会调用obj对象所在类的equals()。
        boolean contains = coll.contains(123);
        System.out.println("contains:"+contains);
        System.out.println(coll.contains(new String("Tom")));
        System.out.println(coll.contains(new Person("Jerry",20)));//false -->true(重写equals后)
        //2.containsAll(Collection coll1):判断形参coll1中的所有元素是否都存在于当前集合中。
        Collection coll1 = Arrays.asList(123,4567);
        System.out.println("containsAll:"+coll.containsAll(coll1));
    }

    @Test
    public void test2(){
        //3.remove(Object obj):从当前集合中移除obj元素。
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        coll.remove(1234);
        System.out.println(coll);
        // 重写equals   移除对象得进行比较 移除哪个对象
        coll.remove(new Person("Jerry",20));
        System.out.println(coll);
        //4. removeAll(Collection coll1):如果你的List list只是用来遍历，就用Arrays.asList() 不支持add与remove方法 clear
        //差集：从当前集合中移除coll1中所有的元素。 A\B  移除A中相同的B元素
        Collection coll1 = Arrays.asList(123,456);
        // List list = Arrays.asList(123,456);
        //  list.add("true");  会报错
        // coll1.add("true"); 不会报错
        coll.removeAll(coll1);
        System.out.println(coll);
    }

    @Test
    public void test3(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //5.retainAll(Collection coll1):交集：获取当前集合和coll1集合的交集，并返回给当前集合
//        Collection coll1 = Arrays.asList(123,456,789);
//        coll.retainAll(coll1);
//        System.out.println(coll);

        //6.equals(Object obj):要想返回true，需要当前集合和形参集合的元素都相同。包括顺序
        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add(456);

        coll1.add(new Person("Jerry",20));
        coll1.add(new String("Tom"));
        coll1.add(false);
        // 有序性
        // 集合的equals比较
        System.out.println(coll.equals(coll1));
    }

    // 集合与数组互转
    @Test
    public void test4(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //7.hashCode():返回当前对象的哈希值
        System.out.println(coll.hashCode());

        //8.集合 ==>数组：使用toArray()  左侧必须是Object类型
        Object[] arr = coll.toArray();
        for(int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }

        //拓展：数组 ==>集合:调用Arrays类的静态方法asList()
        List<String> list = Arrays.asList(new String[]{"AA", "BB", "CC"});
        System.out.println(list);

        List arr1 = Arrays.asList(new int[]{123, 456,789});
        System.out.println(arr1.size());//1 普通数组 会被识别成1个对象元素
        
    /*    System.out.print("这样遍历才能正确输出：");
          int[] ints1 = (int[]) arr1.get(0);
          for(int i : ints1) {
            System.out.print(i + " ");
          }
        */
        List arr2 = Arrays.asList(new Integer[]{123, 456,798});  // 加上包装的类型！！
        System.out.println(arr2.size());//2 包装类对象
        //9.iterator():返回Iterator接口的实例，用于遍历集合元素。放在IteratorTest.java中测试
    }
}
